﻿using log4net;
using SISCON.Common;
using SISCON.Dao;
using SISCON.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SISCON.Bl
{
    public class RoleBL
    {
        private static ILog _Logger = LogManager.GetLogger(typeof(SessionBL));
        private RoleDAO _RolesDAO = new RoleDAO();
        private UserBL _UserBL = new UserBL();

        /// <summary>
        /// Valida los usuarios que tienen acceso al metodo GetRole y manda a llamar al Dao correspondiente
        /// </summary>
        /// <param name="sessionUUID">Sesion del sistema</param>
        /// <param name="roleId">Id interno del rol que se busca</param>
        /// <returns>Rol</returns>
        public Role GetRole(string sessionUUID, long roleId)
        {
            try
            {
                _UserBL.RequireRole(sessionUUID, Role.READ_ACCESS, Role.ROLES);
                return _RolesDAO.GetRole(roleId);
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in GetRole()", ex);
                }
                throw ex;
            }
        }

        /// <summary>
        /// Valida los usuarios que tienen acceso al metodo GetAllRoles y manda a llamar al Dao correspondiente
        /// </summary>
        /// <param name="sessionUUID"></param>
        /// <param name="roleNameFilter"></param>
        /// <returns></returns>
        public List<Role> GetAllRoles(string sessionUUID, string roleNameFilter)
        {
            try
            {
                _UserBL.RequireRole(sessionUUID, Role.READ_ACCESS, Role.ROLES);
                List<Role> GetRoles = _RolesDAO.GetAllRoles(roleNameFilter);
                return GetRoles;
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in GetAllRoles()", ex);
                }
                throw ex;
            }
        }

        /// <summary>
        /// Valida los usuarios que tienen acceso al metodo SaveRole y manda a llamar al Dao correspondiente
        /// </summary>
        /// <param name="sessionUUID">Sesion del sistema</param>
        /// <param name="Role">Rol que se almacenara</param>
        /// <param name="Permissions">Permisos del rol</param>
        public void SaveRole(string sessionUUID, Role Role, Dictionary<string, string> Permissions)
        {
            try
            {
                _UserBL.RequireRole(sessionUUID, Role.WRITE_ACCESS, Role.ROLES);

                if (Role.Name == null || Role.Name.Trim().Length < 3)
                {
                    throw new SISCONException("El nombre del rol no puede ser menor a 3 caracteres.");
                }
                _RolesDAO.SaveRole(Role, Permissions);
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in SaveRole()", ex);
                }
                throw ex;
            }
        }

        /// <summary>
        /// Valida los usuarios que tienen acceso al metodo DeleteRole y manda a llamar al Dao correspondiente
        /// </summary>
        /// <param name="sessionUUID">Sesion del sistema</param>
        /// <param name="RoleId">Id interno del rol que se desea eliminar</param>
        public void DeleteRole(string sessionUUID, string RoleId)
        {
            try
            {
                _UserBL.RequireRole(sessionUUID, Role.WRITE_ACCESS, Role.ROLES);
                _RolesDAO.DeleteRole(RoleId);
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in DeleteRole()", ex);
                }
                throw ex;
            }
        }
    }
}